Keyword: Kotlin DSL
到Day9使用Kotlin DSL 管理依賴的Code放在
KMMDay9
在使用第三方庫的時候,有時候可能同時使用到許多不同的模組,像是昨天的ktor就使用到了 core/ json /logging / okhttp 等等不同的Ktor模組.而在使用這些模組時,如果使用到了不同的版本,例如core更新到了2.3.1,而logging只有1.0.0,就有可能發生意料之外的錯誤,所以除了官方有明確說明可以混用,不然還是統一使用同一個版本號較為安全.
在以往只有一個Gradle檔案管理依賴時,會在這個Gradle檔案中使用version常數作為版本的管理,當要修改內容時只要修改這邊即可.這也是業界常見的做法.
但是KMM由於跨平台的特性,所以KMM專案具有多個gradle各自為政,使用不同版本的依賴還是有發生問題的可能,這時把版本號放在各個gradle中就不是合適的做法了.
新人加入後可能只有改變其中一個gradle的版本號,而其他的部分忘記修改或是根本不知道其他部分有使用到.
最慘的是,專案表面上是看不出什麼異狀的,要一直等到某天突然執行到這個情境.隱藏的地雷爆炸.才又花上大精力去補救.
好在Kotlin也有考慮到這個問題,我們可以使用Kotlin DSL功能 來進行版本的統一管理.
在Android Studio內,切換成專案頁面,然後在專案的根目錄建立一個名為buildSrc的路徑
建立好之後在其中再增加一個名為build.gradle.kts的檔案,並且填上Kotlin-DSL的依賴,有了這幾行文字並編譯後,Gradle就能認出來這是給Gradle使用的Kotlin DSL
plugins{
`kotlin-dsl`
}
repositories {
mavenCentral()
}
這時候gradle仍然認為這只是一般檔案,所以請進行Gradle sync
之後就在這個路徑底下,建立起src/main/java的路徑,在裡面建立起一個Dependencies.kt的檔案,這邊就是我們以後管理各個版本的區塊
全部完成後,會像這樣
然後把前幾天寫的Gradle引用逐漸搬進來這個新建立的檔案,首先先抽出版本號,現在有用到的是Ktor與Kotlin serialization,將各gradle內的版本都集中起來
object Versions{
val ktor = "1.6.3"
val serialization_version = "1.5.21"
}
然後我們再建立一個Develop物件,裡面放入Develop環境所使用的依賴,就像這樣
object Develop{
object Ktor{
val commonCore = "io.ktor:ktor-client-core:${Versions.ktor}"
val commonJson = "io.ktor:ktor-client-json:${Versions.ktor}"
val commonLogging = "io.ktor:ktor-client-logging:${Versions.ktor}"
val androidCore = "io.ktor:ktor-client-okhttp:${Versions.ktor}"
val ios = "io.ktor:ktor-client-ios:${Versions.ktor}"
val commonSerialization = "io.ktor:ktor-client-serialization:${Versions.ktor}"
}
}
由於在實務上,有可能Develop環境與正式環境有不同的依賴,所以會獨立開來寫,這樣在進行編譯的時候就能使用到不同的參數.
如法炮製,把serialization的依賴也加入到Develop中,全部寫完後記得再次Sync gradle
之後就能在其他的build.gradle中直接使用,使用的方法可以直接呼叫,非常方便,以shared內的gradle為例
...
sourceSets {
val commonMain by getting {
dependencies {
implementation(Develop.Ktor.commonCore)
implementation(Develop.Ktor.commonJson)
implementation(Develop.Ktor.commonLogging)
implementation(Develop.Ktor.commonSerialization)
implementation(Develop.Coroutines.common)
}
}
...
}
如何,是不是清楚多了?並且需要更新時只要修改Dependencies內的數據,便會整個專案一起修改.
準備好所有工具後,我們明天正式開始寫Ktor,來進行網路請求.